\section{Introduction}
The speedup in computational power has reached a brickwall in terms of sequential speedup. Microprocessors can no longer execute the same instruction faster and hence in order to provide opportunities for program speedup the microprocessor manufacturers have started supplying chips with multiple processor cores. But the only way now for computer programs to increase their performance is to utilize the multiple CPU cores. This can only be achieved by parallelizing the program execution over these multiple cores i.e. executing instructions on the cores concurrently. Erlang is a programing language that was written with easy concurrency as one of the design goals and is thus ideally suited for the demands of the parallel world. It provides language primitives and thereby a thinking framework to write parallel programs.

The purpose of this study was to not only understand the Parallel programming model provided by Erlang, but also to study the details of its Virtual Machine implementations to understand the techniques used for performance speedup. This report is divided into four sections. In the section 2 we discuss the key features of Erlang which highlight the design choices made by the authors of the programming language. We also bring forward in this section the motivations behind these choices. Section 3 details the various Virtual Machine implementations that have existed for Erlang and the differences between them. We also discuss the High Performance Erlang (HiPE) \cite{hipe} compiler which compiles Erlang to native code. In section 4 we introduce the concurrency primitives of Erlang and their semantics. In this section we also discuss how the Erlang VM schedules the collaborating processes for execution.
